/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Ventanas;

import Offline.Deshacer;
import Offline.Usuario;
import Online.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;
import javax.swing.table.DefaultTableModel;

/**
 * @author Alvaro Garcia Tapia
 * @author Pablo Mosquera Diaz
 * @author Victor Navarro Ortego
 * @author Adrian Neila Serrano
 * @author Daniel Sanchez Suarez
 * 
 * @proyecto Gestor de Tareas Online
 * @version 1.2
 */
public class Ventana extends JFrameConFondo implements ActionListener{
    
    //Creación de variables
    private JPanelConFondo opciones = new JPanelConFondo();
    private JLabel labelInfo; 
    private JButton botonLogout;
    private JButton botonDeshacer;
    private JButton botonSiguiente;
    private JButton botonAtras;
    private JButton botonEnviar;
    private JButton botonMensajes;
    private JButton botonMapas;
    private JButton botonNewTarea;
    private JButton botonModificar;
    private JButton botonEliminarTarea;
    private JButton botonNuevaLista;
    private JButton botonEliminarLista;
    private JButton botonExportarLista;
    private JButton botonCargar;
    private JButton botonOnLine;
    private JButton botonPreferencias;
    private boolean online = true;
    Usuario usuario;
    private int x;
    private int y;
    String name;
    private String[] listas = new String[100];
    private String[] tareas = new String[1000];
    private DefaultTableModel dtm = new DefaultTableModel(); 
    private JTable table = new JTable(dtm);
    private JScrollPane jsp;
    private int xlogout;
    private JComboBox ListaBox;	
    private JLabel labelLista; 
    int numLista = 0;
    private int numtareas = 0;
    private boolean repintando = false;
    private String [] listfav=new String[100];
    private Comprobar comprobar;
    
    private int numeroTareas;
    private int tareainicio;
    private ArrayList<Deshacer> deshacer = new ArrayList<Deshacer>();
    private JButton barra;
    
    
    public Ventana(String name, String ListaPrederterminada,int numeroTareas,int tareainicio,
                boolean online, Usuario usuario, ArrayList deshacer){
        //constructor JFrame
	super("Gestor de Tareas Online"); 

        
        //Almacenamiento del user 
        this.name = name;
        this.online = online;
        this.usuario = usuario;
        this.numeroTareas = numeroTareas;
        this.tareainicio = tareainicio;
        this.deshacer = deshacer;
        
        
        //Generación del objeto que interactua con la bbdd para listas
        String [] list=new String[100];
        Listas lista = conectarLista();

        //Se obtienen las listas del usuario
        list = lista.getListas(name);
             
        int i;
        for(i = 0;list[i]!=null;i++){}
        listas = new String[i+1];
        for(i = 0;list[i]!=null;i++){
            if (ListaPrederterminada.equals(list[i]))
                numLista = i;
            listas[i]=list[i];
        }
        if(ListaPrederterminada.equals("Favoritos"))
                numLista = i;
        listas[i] = "Favoritos";
        
        
       comprobar = new Comprobar(name,this,numLista,tareainicio,null);
       if (comprobar.nuevos())
            comprobar.parar();
       else
            comprobar.start();
       
        
        //Dimensiones de la pantalla
        Dimension dim=super.getToolkit().getScreenSize(); 
        x = (int)dim.width;
        y = (int)dim.height;
        
        //Opciones de ventana
	this.setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
        //se añade la opción de preguntar antes de salir
        addWindowListener(new java.awt.event.WindowAdapter() {
            public void windowClosing(java.awt.event.WindowEvent evt) {
                close();
            }
        });
        setLayout(null);
        //setSize(500,500);
	setExtendedState(MAXIMIZED_BOTH);
	Container contenidoPanel = getContentPane();
        contenidoPanel.setBackground(Color.LIGHT_GRAY);
        setIconImage(new ImageIcon(getClass().getResource("objetos/icono.png")).getImage()); 

  
        //Se pinta la tabla de la Lista Principal
        PaintTable(numLista);
        
        //Se genera un panel para opciones
        opciones.setLayout(null);
        opciones.setBackground(Color.LIGHT_GRAY);
        opciones.setImagen("objetos/fondo1.jpg");
        //Se calcula el ancho del panel de opciones
        xlogout = x/2;
       
        
        
        barra = new JButton(""); 
	opciones.add(barra);
	barra.setBounds((int)(xlogout*0.18),(int)(y*0.42),(int)(xlogout*0.76)-(int)(xlogout*0.18),1);
        barra.setBackground(Color.white);
        barra.setBorderPainted(false);
        
        //Constucción del boton Logout
	botonLogout = new JButton("Logout"); 
	opciones.add(botonLogout);
	botonLogout.setBounds((int)(xlogout*0.79),(int)(y*0.02),100,30);
        botonLogout.setFont(new java.awt.Font("Arial", 0, 20)); 
        botonLogout.setActionCommand("Logout");
        botonLogout.addActionListener(this);
        botonLogout.setIcon(new ImageIcon(getClass().getResource("objetos/Logout.jpg")));
        
        //Constucción del boton Logout
	botonPreferencias = new JButton("Preferencias"); 
	opciones.add(botonPreferencias);
	botonPreferencias.setBounds((int)(xlogout*0.71),(int)(y*0.02),30,30);
        botonPreferencias.setFont(new java.awt.Font("Arial", 0, 20)); 
        botonPreferencias.setActionCommand("Preferencias");
        botonPreferencias.addActionListener(this);
        botonPreferencias.setToolTipText("Preferencias");
        botonPreferencias.setIcon(new ImageIcon(getClass().getResource("objetos/Preferencias.jpg")));   
        
        //Constucción del boton Logout
	botonDeshacer = new JButton("Deshacer"); 
	opciones.add(botonDeshacer);
	botonDeshacer.setBounds((int)(xlogout*0.63),(int)(y*0.02),30,30);
        botonDeshacer.setFont(new java.awt.Font("Arial", 0, 20)); 
        botonDeshacer.addActionListener(this);
        botonDeshacer.setToolTipText("Deshacer aciones de tareas");
        if(deshacer.isEmpty()){
            botonDeshacer.setIcon(new ImageIcon(getClass().getResource("objetos/No Deshacer.jpg")));  
            botonDeshacer.setBorderPainted(false);
        }
        else{
            botonDeshacer.setActionCommand("Deshacer");
            botonDeshacer.setIcon(new ImageIcon(getClass().getResource("objetos/Deshacer.jpg")));  
            botonDeshacer.setBorderPainted(true);
        }
        
        if (online){
            //Constucción del boton Logout
            botonOnLine = new JButton("Online");
            botonOnLine.setIcon(new ImageIcon(getClass().getResource("objetos/Online.jpg")));
            botonOnLine.setActionCommand("Online");
        }
        else{
            botonOnLine = new JButton("Offline"); 
            botonOnLine.setIcon(new ImageIcon(getClass().getResource("objetos/Offline.jpg")));
            botonOnLine.setActionCommand("Offline");
        }
        
        opciones.add(botonOnLine);
        botonOnLine.setBounds((int)(xlogout*0.4315),(int)(y*0.02),100,30);
        botonOnLine.setFont(new java.awt.Font("Arial", 0, 20)); 
        botonOnLine.addActionListener(this);

       
        //Constucción del boton Logout
	botonEnviar = new JButton("Enviar"); 
	opciones.add(botonEnviar);
	botonEnviar.setBounds((int)(xlogout*0.23),(int)(y*0.02),100,30);
        botonEnviar.setFont(new java.awt.Font("Arial", 0, 20)); 
        botonEnviar.setActionCommand("Enviar");
        botonEnviar.addActionListener(this);
        botonEnviar.setIcon(new ImageIcon(getClass().getResource("objetos/Enviar Tarea.jpg")));
        

        //Constucción del boton Logout
	botonMensajes = new JButton("Mensajes"); 
	opciones.add(botonMensajes);
	botonMensajes.setBounds((int)(xlogout*0.15),(int)(y*0.02),30,30);
        botonMensajes.setFont(new java.awt.Font("Arial", 0, 20)); 
        botonMensajes.setActionCommand("Mensajes");
        botonMensajes.addActionListener(this);
        botonMensajes.setToolTipText("Tareas Recibidas");
        if (comprobar.nuevos() && online)
            botonMensajes.setIcon(new ImageIcon(getClass().getResource("objetos/Mensaje Nuevo.jpg")));
            
        else
            botonMensajes.setIcon(new ImageIcon(getClass().getResource("objetos/Mensaje.jpg")));
        
        //Constucción del boton Nueva tarea
	botonNewTarea = new JButton("Nueva Tarea"); 
	opciones.add(botonNewTarea);
	botonNewTarea.setBounds((int)(xlogout*0.3),(int)(y*0.1),225,40);
        botonNewTarea.setFont(new java.awt.Font("Arial", 0, 25)); 
        botonNewTarea.setActionCommand("NewTarea");
        botonNewTarea.addActionListener(this);
        botonNewTarea.setIcon(new ImageIcon(getClass().getResource("objetos/Nueva Tarea.jpg")));
        
                
        //Constucción del boton Modificar tarea
	botonModificar = new JButton("Modificar Tarea"); 
	opciones.add(botonModificar);
	botonModificar.setBounds((int)(xlogout*0.3),(int)(y*0.2),225,40);
        botonModificar.setFont(new java.awt.Font("Arial", 0, 25)); 
        botonModificar.setActionCommand("Modificar");
        botonModificar.addActionListener(this);
        botonModificar.setIcon(new ImageIcon(getClass().getResource("objetos/Modificar Tarea.jpg")));
        
        
        //Constucción del boton Eliminar tarea
	botonEliminarTarea = new JButton("Eliminar Tarea"); 
	opciones.add(botonEliminarTarea);
	botonEliminarTarea.setBounds((int)(xlogout*0.3),(int)(y*0.3),225,40);
        botonEliminarTarea.setFont(new java.awt.Font("Arial", 0, 25)); 
        botonEliminarTarea.setActionCommand("Eliminar");
        botonEliminarTarea.addActionListener(this);
        botonEliminarTarea.setIcon(new ImageIcon(getClass().getResource("objetos/Eliminar Tarea.jpg")));
        
        
        //Constucción del boton Nueva Lista
	botonNuevaLista = new JButton("Nueva Lista"); 
	opciones.add(botonNuevaLista);
	botonNuevaLista.setBounds((int)(xlogout*0.3),(int)(y*0.47),225,40);
        botonNuevaLista.setFont(new java.awt.Font("Arial", 0, 25)); 
        botonNuevaLista.setActionCommand("New Lista");
        botonNuevaLista.addActionListener(this);
        botonNuevaLista.setIcon(new ImageIcon(getClass().getResource("objetos/Nueva Lista.jpg")));
        
        
        //Constucción del boton Nueva Lista
	botonEliminarLista = new JButton("Eliminar Lista"); 
	opciones.add(botonEliminarLista);
	botonEliminarLista.setBounds((int)(xlogout*0.3),(int)(y*0.57),225,40);
        botonEliminarLista.setFont(new java.awt.Font("Arial", 0, 25)); 
        botonEliminarLista.setActionCommand("Eliminar Lista");
        botonEliminarLista.addActionListener(this);
        botonEliminarLista.setIcon(new ImageIcon(getClass().getResource("objetos/Eliminar Lista.jpg")));
        
                //Constucción del boton Nueva Lista
	botonExportarLista = new JButton("Exportar Lista"); 
	opciones.add(botonExportarLista);
	botonExportarLista.setBounds((int)(xlogout*0.3),(int)(y*0.67),225,40);
        botonExportarLista.setFont(new java.awt.Font("Arial", 0, 25)); 
        botonExportarLista.setActionCommand("Exportar Lista");
        botonExportarLista.addActionListener(this);
        botonExportarLista.setIcon(new ImageIcon(getClass().getResource("objetos/Exportar Lista.jpg")));
        
        //Se añade el panel de opciones
        add(opciones);
        
        //Se hace visible la ventana
        setVisible(true);
    }
    
    public void nuevo(){
        botonMensajes.setIcon(new ImageIcon(getClass().getResource("objetos/Mensaje.jpg")));
        repaint();
    }

    
    /**
     * Metodo que pinta la tabla de la lista de tareas
     */
    public void PaintTable(int numLista){
        labelInfo = new JLabel("Conectado como: "+name);
        labelInfo.setBounds((int)(x*0.01),(int)(y*0.01),300,10);
        labelInfo.setForeground(Color.white);
        
        //Se crea el titulo de la tabla
        JLabel titulo;
        titulo = new JLabel(listas[numLista]);
        titulo.setBounds((int)(x*0.18),(int)(y*0.05), 300, 30);
        titulo.setForeground(Color.white);
        titulo.setFont(new java.awt.Font("Tahoma", 0, 25)); 
        
                //Constucción del boton Logout
	botonMapas = new JButton("Mapas"); 
	botonMapas.setBounds((int)(x*0.005),(int)(y*0.04),40,40);
        botonMapas.setFont(new java.awt.Font("Arial", 0, 20)); 
        botonMapas.setActionCommand("Mapas");
        botonMapas.addActionListener(this);
        botonMapas.setToolTipText("Mapas");
        botonMapas.setIcon(new ImageIcon(getClass().getResource("objetos/mapas.jpg")));

        
        //Se crea el panel donde se ubicara la tabla
        JPanelConFondo tabla = new JPanelConFondo();
        tabla.add(titulo);
        tabla.add(labelInfo);
        tabla.add(botonMapas);
	tabla.setBackground(Color.LIGHT_GRAY);
        tabla.setImagen("objetos/fondo2.jpg");
        //Se obliga que las celdas no sean editables
        dtm = new DefaultTableModel();

        
        Tareas tarea = null;
        
        //Se crea el objeto que interactuara con la bbdd para tareas    
        tarea = new Tareas();
        //Se obtienen las tareas de la lista
        if(!listas[numLista].equals("Favoritos"))
            tareas = tarea.gettareas(name, listas[numLista]);
        else{
            String[][] favoritos = tarea.getfavoritos(name);
            if (favoritos != null)
                for(int i = 0;favoritos[i][0]!=null;i++){
                    tareas[i] = favoritos[i][0];
                    listfav[i] = favoritos[i][1];
                }
        }
        boolean nottarea = false;
        
        
        if(tareas[0] == null)
            nottarea = true;
        
        Object [][] contenidoTabla = new Object[5][numeroTareas];   
        int ntareas = 0;
        int j = 0;
        int tope = 0;
        

        //Se calculan el numero de tareas(para pintar la tabla lo más ajustada posibe
        numtareas=0;
        for(int k=0;k<tareas.length && tareas[k]!=null;k++){numtareas++;}
        while(numtareas<=tareainicio && tareainicio !=0){
            tareainicio = tareainicio-numeroTareas;
            if (tareainicio<0)
                tareainicio = 0;
        } 
        //Si hay menos de 19 tareas se indica que se pinten 19 tareas 
        if (numeroTareas>16)
            tope=16;
        else
            tope = numeroTareas;
        
        if(!nottarea){
            //Variable que contendra las 3 columnas (Nombre, Fecha, Tiempo)
            for(j=0;j<numeroTareas && tareas[tareainicio+j]!=null;j++){
                //Se piden los datos de la tarea
                String [] fila;
                if (!listas[numLista].equals("Favoritos"))
                    fila = tarea.gettarea(name, listas[numLista], tareas[tareainicio+j]);
                else
                    fila = tarea.gettarea(name, listfav[tareainicio+j], tareas[tareainicio+j]);
            
                
                //Se almacenan en sus respectiva fila
                JButton fav = new JButton("");
                fav.setBackground(Color.black);
                fav.setSize(10, 10);
                fav.addActionListener(this);
                if (fila[3].equals("0")){
                    fav.setIcon(new ImageIcon(getClass().getResource("objetos/No favorito.jpg")));
                    fav.setActionCommand("Favorito");
                }
                else{
                    fav.setIcon(new ImageIcon(getClass().getResource("objetos/Favorito.jpg")));
                    fav.setActionCommand("No favorito");
                }
                contenidoTabla[0][j] = fav;
                contenidoTabla[1][j] = tareas[tareainicio+j];
                contenidoTabla[2][j] =fila[0];
                contenidoTabla[3][j] =fila[1]; 
                contenidoTabla[4][j] = new Boolean(false);
                ntareas = tareainicio+j;
            }    
            if(tareas[ntareas]==null)ntareas--;
        }
        for(int u = j; u < numeroTareas;u++){
            JButton fav = new JButton("");
            fav.setBackground(Color.black);
            fav.setSize(10, 10);
            contenidoTabla[0][u] = fav;
        }
        
        dtm = new DefaultTableModel(){
            public boolean isCellEditable (int fila, int columna) {
                return (columna == 4)||(columna == 0);
            }
            
            Class[] types = new Class [] {
                javax.swing.JButton.class,java.lang.Object.class, java.lang.Object.class, java.lang.Object.class, java.lang.Boolean.class
            };

            public Class getColumnClass(int columnIndex) {
                return types [columnIndex];
            }
            
        };
        
                
        //Creacion de las cabeceras de la tabla
        dtm.addColumn("",contenidoTabla[0]);
        dtm.addColumn("Nombre",contenidoTabla[1]);
        dtm.addColumn("Fecha de Finalización",contenidoTabla[2]);
        dtm.addColumn("Tiempo Límite",contenidoTabla[3]);
        dtm.addColumn(" ",contenidoTabla[4]);

        
        //Se crea la tabla, estara compuesta por la tabla por defecto dtm
        
        table = new JTable(dtm){                    
            @Override
             public String getToolTipText(MouseEvent e) {
                String tip = null;
                java.awt.Point p = e.getPoint();
                int rowIndex = rowAtPoint(p);
                int colIndex = columnAtPoint(p);
                if (this.getValueAt(rowIndex , 2)!=null){
                    if (colIndex == 0)
                        tip = "Marcar como favoritos";
                    else if (colIndex == 4)
                        tip = "Marcar para eliminar o enviar";
                    else
                        tip = this.getValueAt(rowIndex , 2).toString();
                }
                return tip;
            }
        };
        table.setAlignmentX(JTable.CENTER_ALIGNMENT);
        table.setAlignmentY(JTable.CENTER_ALIGNMENT);
             // Establecemos el renderer y editor que usaremos para el boton
        table.setDefaultRenderer(JButton.class, new ButtonCellRenderer());
        table.setDefaultEditor(JButton.class, new ButtonCellEditor());
        
        table.getColumn("").setMaxWidth(20);
        table.getColumn("Nombre").setPreferredWidth(90);
        table.getColumn("Fecha de Finalización").setPreferredWidth(90);
        table.getColumn("Tiempo Límite").setPreferredWidth(50);
        table.getColumn(" ").setMaxWidth(10);

        //Se elimina la posibilidad de posicionar columnas
        table.getTableHeader().setReorderingAllowed(false);
        //Se limita la posibilidad del numero de filas a seleccionar
        table.setRowSelectionAllowed(true);
        table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); 
        //Opciones de la tabla
        table.setRowHeight(30);
        table.getTableHeader().setFont(new java.awt.Font("Tahoma", 0, 15)); 
        table.setFont(new java.awt.Font("Tahoma", 0, 14));
        table.setVisible(true); 
        
        //Se introduce un scroll para la tabla
        jsp = new JScrollPane(table);
        //Opciones del scroll
        jsp.setLayout(null);
        //30 de alto cada fila
        //cada 5 filas sumar 1
        //23 de cabecera
        int altura = tope*30+23+(int)(23/5);
        jsp.setBounds((int)(x*0.06),(int)(y*0.1), 448, altura/*566*/);
        jsp.setVisible(true);
        jsp.setLayout(new ScrollPaneLayout()); 
           
        //Opciones del panel que contiene la tabla
        tabla.setLayout(null);
        tabla.add(jsp);  
        
        double siguiente = 0.242+tope*0.036;
        if((numtareas-tareainicio) > numeroTareas){
            //Constucción del boton Logout
            botonSiguiente = new JButton(">"); 
            tabla.add(botonSiguiente);
            botonSiguiente.setBounds((int)(x*0.388),(int)(y*(siguiente-0.065)),30,30);
            botonSiguiente.setFont(new java.awt.Font("Arial", 0, 20)); 
            botonSiguiente.setActionCommand("Siguiente");
            botonSiguiente.addActionListener(this);
            botonSiguiente.setToolTipText("Siguiente");
            botonSiguiente.setIcon(new ImageIcon(getClass().getResource("objetos/Siguiente.jpg")));
        }
        if(tareainicio>0){
            //Constucción del boton Logout
            botonAtras = new JButton("<"); 
            tabla.add(botonAtras);
            botonAtras.setBounds((int)(x*0.35),(int)(y*(siguiente-0.065)),30,30);
            botonAtras.setFont(new java.awt.Font("Arial", 0, 20)); 
            botonAtras.setActionCommand("Atras");
            botonAtras.addActionListener(this);
            botonAtras.setToolTipText("Atras");
            botonAtras.setIcon(new ImageIcon(getClass().getResource("objetos/Atras.jpg")));
        }
        
        //Cuadrante para elegir la lista
	labelLista = new JLabel("Listas:");
	labelLista.setBounds((int)(x*0.08),(int)(y*siguiente/*0.865*/),70,20);
        labelLista.setForeground(Color.white);
        labelLista.setFont(new java.awt.Font("Tahoma", 0, 18)); 
        ListaBox = new JComboBox(listas);
        ListaBox.setBounds((int)(x*0.14),(int)(y*(siguiente-0.005)),190,27);
        ListaBox.setFont(new java.awt.Font("Tahoma", 0, 18)); 
        ListaBox.setSelectedItem(listas[numLista]);
        tabla.add(labelLista);
        tabla.add(ListaBox);
        
        //Constucción del boton Cargar Lista
	botonCargar = new JButton("Cargar"); 
	tabla.add(botonCargar);
	botonCargar.setBounds((int)(x*0.06)+348,(int)(y*(siguiente-0.005)),100,27);
        botonCargar.setFont(new java.awt.Font("Arial", 0, 18)); 
        botonCargar.setActionCommand("Cargar");
        botonCargar.addActionListener(this);
        botonCargar.setIcon(new ImageIcon(getClass().getResource("objetos/Cargar.jpg")));
        
        //Opcion para que se muestre la tabla
        setLayout(new GridLayout()); 
        //Se añade la tabla
        add(tabla);        
    }

    
    public void activar(){
        comprobar = new Comprobar(name,this,numLista,tareainicio,null);
        comprobar.start();
        repintando = false;
    }
    
   
    
    /**
    * Función que se encarga de cerrar el programa
    */
    public void close(){
        this.setCursor(Cursor.WAIT_CURSOR);
        String message = "¿Está seguro de que quiere salir?";
        String title = "Logout";
        //Se pregunta si se desea desconectar
        int reply = JOptionPane.showConfirmDialog(null, message, title, JOptionPane.YES_NO_OPTION);
        this.setCursor(Cursor.DEFAULT_CURSOR);
        //Si acepta 
        if (reply == JOptionPane.YES_OPTION)
        {
            this.setCursor(Cursor.WAIT_CURSOR);
            //Se muestra el aviso de que se cierra
            new AvisoDesconexion();
            //Se cierra el programa
            System.exit(0);
            //Se cierra la ventana de login
            setVisible(false);
            setDefaultCloseOperation(DISPOSE_ON_CLOSE); 
            this.setCursor(Cursor.DEFAULT_CURSOR);
        }
   }
    
    
    /**
     * Metodo para conectar los usuarios con la bbdd
     * @return La conexión con la bbdd
     */
    private Inicio conectarInicio(){
        //Se crea el objeto para actuar contra la bbdd
        Inicio inicio = new Inicio();
        boolean salir = false;
        //Si no se ha conectado
        while (!inicio.estado() && !salir){
            this.setCursor(Cursor.WAIT_CURSOR);
            String message = "Fallo al conectar con el servidor.\n¿Desea volver a intentar conectar?";
            String title = "Error de conexión";
            //Se ofrece la opcion de reconectar
            int reply = JOptionPane.showConfirmDialog(null, message, title, JOptionPane.YES_NO_OPTION);
            this.setCursor(Cursor.DEFAULT_CURSOR);
            //Si rechazo reconectar
            if (reply == JOptionPane.NO_OPTION){     
                this.setCursor(Cursor.WAIT_CURSOR);
                salir=true;
                new VentanaInicio();
                //Se cierra la ventana de login
                setVisible(false);
                setDefaultCloseOperation(DISPOSE_ON_CLOSE); 
                this.setCursor(Cursor.DEFAULT_CURSOR);
            }
            //Si se acepto reconectar
            else{
                this.setCursor(Cursor.WAIT_CURSOR);
                //Se reconecta
                inicio = new Inicio();
                this.setCursor(Cursor.DEFAULT_CURSOR);
            }    
        }
        return inicio;
    }
    
    
       /**
     * Metodo para conectar los usuarios con la bbdd
     * @return La conexión con la bbdd
     */
    private Mensajes conectarMensaje(){
        //Se crea el objeto para actuar contra la bbdd
        Mensajes mensaje = new Mensajes();
        boolean salir = false;
        //Si no se ha conectado
        while (!mensaje.estado() && !salir){
            this.setCursor(Cursor.WAIT_CURSOR);
            String message = "Fallo al conectar con el servidor.\n¿Desea volver a intentar conectar?";
            String title = "Error de conexión";
            //Se ofrece la opcion de reconectar
            int reply = JOptionPane.showConfirmDialog(null, message, title, JOptionPane.YES_NO_OPTION);
            this.setCursor(Cursor.DEFAULT_CURSOR);
            //Si rechazo reconectar
            if (reply == JOptionPane.NO_OPTION){     
                this.setCursor(Cursor.WAIT_CURSOR);
                salir=true;
                new VentanaInicio();
                //Se cierra la ventana de login
                setVisible(false);
                setDefaultCloseOperation(DISPOSE_ON_CLOSE); 
                this.setCursor(Cursor.DEFAULT_CURSOR);
            }
            //Si se acepto reconectar
            else{
                this.setCursor(Cursor.WAIT_CURSOR);
                //Se reconecta
                mensaje = new Mensajes();
                this.setCursor(Cursor.DEFAULT_CURSOR);
            }    
        }
        return mensaje;
    }
    
    
    /**
     * Metodo para conectar las tareas con la bbdd
     * @return La conexión con la bbdd
     */
    private Tareas conectarTarea(){
        //Se crea el objeto para actuar contra la bbdd
        Tareas tarea = new Tareas();
        boolean salir = false;
        //Si no se ha conectado
        while (!tarea.estado() && !salir){
            this.setCursor(Cursor.WAIT_CURSOR);
            String message = "Fallo al conectar con el servidor.\n¿Desea volver a intentar conectar?";
            String title = "Error de conexión";
            //Se ofrece la opcion de reconectar
            int reply = JOptionPane.showConfirmDialog(null, message, title, JOptionPane.YES_NO_OPTION);
            this.setCursor(Cursor.DEFAULT_CURSOR);
            //Si rechazo reconectar
            if (reply == JOptionPane.NO_OPTION){     
                this.setCursor(Cursor.WAIT_CURSOR);
                salir=true;
                new VentanaInicio();
                //Se cierra la ventana de login
                setVisible(false);
                setDefaultCloseOperation(DISPOSE_ON_CLOSE); 
                this.setCursor(Cursor.DEFAULT_CURSOR);
            }
            //Si se acepto reconectar
            else{
                this.setCursor(Cursor.WAIT_CURSOR);
                //Se reconecta
                tarea = new Tareas();
                this.setCursor(Cursor.DEFAULT_CURSOR);
            }    
        }
        return tarea;
    }
    
    
    /**
     * Metodo para conectar las listas con la bbdd
     * @return La conexión con la bbdd
     */
    private Listas conectarLista(){
        Listas lista = new Listas();
        boolean salir = false;
        //Si no se ha conectado
        while (!lista.estado() && !salir){
            this.setCursor(Cursor.WAIT_CURSOR);
            String message = "Fallo al conectar con el servidor.\n¿Desea volver a intentar conectar?";
            String title = "Error de conexión";
            //Se ofrece la opcion de reconectar
            int reply = JOptionPane.showConfirmDialog(null, message, title, JOptionPane.YES_NO_OPTION);
                this.setCursor(Cursor.DEFAULT_CURSOR);
            //Si rechazo reconectar
            if (reply == JOptionPane.NO_OPTION){     
                this.setCursor(Cursor.WAIT_CURSOR);
                salir=true;
                new VentanaInicio();
                //Se cierra la ventana de login
                setVisible(false);
                setDefaultCloseOperation(DISPOSE_ON_CLOSE); 
                this.setCursor(Cursor.DEFAULT_CURSOR);
            }
            //Si se acepto reconectar
            else{
                this.setCursor(Cursor.WAIT_CURSOR);
                //Se reconecta
                lista = new Listas();
                this.setCursor(Cursor.DEFAULT_CURSOR);
            }    
        }
        return lista;
    }
    
    
    
    /**
     * Metodo que actualiza la tabla de tareas
     */
    public Ventana ActualizarTablas(int numLista,int tareaini,ArrayList<Deshacer>deshacer, boolean online){
        this.online = online;
        comprobar.parar();
        Opciones opciones = new Opciones();
        String[] datoO = opciones.getOpcion(name);
        Listas lista = conectarLista();
        //Se obtienen las listas del usuario
        String listas[] = lista.getListas(name);
        String list = listas[numLista];
        if (list == null) list ="Favoritos";
        Ventana window;
        //Se crea una nueva ventana
        if (deshacer!=null)
            window = new Ventana(name,list, Integer.parseInt(datoO[0]),
                        tareaini,online,usuario,deshacer);
        else
            window = new Ventana(name,list, Integer.parseInt(datoO[0]),
                        tareaini,online,usuario,this.deshacer);
        repintando = true;
        //Se cierra la actual ventana
        setVisible(false);
        setDefaultCloseOperation(DISPOSE_ON_CLOSE); 
        return window;
    }
    
    
    @Override
    public void actionPerformed(ActionEvent e) {
        
        //Variable que contiene el boton pulsado
         String comando = e.getActionCommand();
         if (!repintando){   
            //Si se pulso el boton logout
            if (comando.equals("Logout")){
                this.setCursor(Cursor.WAIT_CURSOR);
                String message = "¿Está seguro de que quiere cerrar sesión?";
                String title = "Logout";
                //Se pregunta si se desea desconectar
                int reply = JOptionPane.showConfirmDialog(null, message, title, JOptionPane.YES_NO_OPTION);
                this.setCursor(Cursor.DEFAULT_CURSOR);
                //Si acepta 
                if (reply == JOptionPane.YES_OPTION){
                    this.setCursor(Cursor.WAIT_CURSOR);    
                    new VentanaInicio();
                    setVisible(false);
                    setDefaultCloseOperation(DISPOSE_ON_CLOSE);
                    this.setCursor(Cursor.DEFAULT_CURSOR);
                } 
            }
            //Si se pulso el boton nueva tarea
            else if (comando.equals("NewTarea")){
                if(!listas[numLista].equals("Favoritos")){
                    repintando = true;
                    comprobar.parar();
                    new VentanaTarea(this.listas[numLista],this.name, this,numLista,tareainicio,deshacer,online);
                }
                else
                    JOptionPane.showMessageDialog (null,"No se puede crear una tarea en la lista de Favoritos.",
				"Atención", JOptionPane.WARNING_MESSAGE);
            }
            //Si se pulso el boton modificar tarea
            else if (comando.equals("Modificar")){
                //Se comprueba si se ha seleccionado una tarea
                if ((table.getSelectedRow()== -1)||(tareas[table.getSelectedRow()]== null))
                    JOptionPane.showMessageDialog (null,"Debe seleccionar una tarea valida para poder ser modificada.",
                                    "Atención", JOptionPane.INFORMATION_MESSAGE);
                else
                    if(!listas[numLista].equals("Favoritos")){
                        repintando = true;
                        comprobar.parar();
                        new VentanaMTarea(this.name,this.listas[numLista],
                                tareas[table.getSelectedRow()], this,numLista,tareainicio,deshacer,online);
                    }
                    else{
                        repintando = true;
                        comprobar.parar();
                        new VentanaMTarea(this.name,this.listfav[table.getSelectedRow()],
                                tareas[table.getSelectedRow()], this,numLista,tareainicio,deshacer,online);
                    }
            }
            //Si se pulso el boton eliminar tarea
            else if (comando.equals("Eliminar")){
                //Se comprueba si seselecciono una tarea
                String [] Borrados = new String [numtareas];
                int [] Borrad = new int[numtareas];
                int Aborrar = 0;
                boolean end = false;
                for(int o = 0;o <numtareas && table.getValueAt(o , 1)!=null; o++){
                    String bool = table.getValueAt(o , 4).toString();
                    if ((bool != null)&&(bool.equals("true"))){
                        Borrad[Aborrar] = o;
                        Borrados[Aborrar] = table.getValueAt(o , 1).toString();
                        Aborrar++;
                    }  
                }
                if(Aborrar == 0)
                    JOptionPane.showMessageDialog (null,"Debe seleccionar una tarea valida para poder ser eliminada.",
				"Atención", JOptionPane.INFORMATION_MESSAGE);
                else{
                    this.setCursor(Cursor.WAIT_CURSOR);
                    String message;
                    if (Aborrar == 1)
                        message = "¿Está seguro de que quiere Eliminar la tarea "+Borrados[0]+"?";
                    else
                        message="¿Está seguro de querer borrar "+Aborrar+" tareas?";
                    String title = "Eliminar";
                    //Se pide confirmacion para eliminar la tarea
                    int reply = JOptionPane.showConfirmDialog(null, message, title, JOptionPane.YES_NO_OPTION);
                    this.setCursor(Cursor.DEFAULT_CURSOR);
                    //Si se confirma
                    if (reply == JOptionPane.YES_OPTION){
                        this.setCursor(Cursor.WAIT_CURSOR);
                        Tareas tarea = conectarTarea();
                        //Si se consigue la conexion
                        if(tarea!=null){
                            for(int i = 0; i < Aborrar;i++){
                                if(!listas[numLista].equals("Favoritos")){
                                    String []data =tarea.gettarea(name, listas[numLista], Borrados[i]);
                                    tarea.eliminartarea(name+listas[numLista]+Borrados[i]);
                                    deshacer.add(new Deshacer("Eliminar",name,listas[numLista],Borrados[i],
                                                                Integer.parseInt(data[3]),data[0],data[1],""));
                                }
                                else{
                                    String []data =tarea.gettarea(name, listfav[Borrad[i]], Borrados[i]);
                                    tarea.eliminartarea(name+listfav[Borrad[i]]+Borrados[i]);
                                    deshacer.add(new Deshacer("Eliminar",name,listfav[Borrad[i]],Borrados[i],
                                                                Integer.parseInt(data[3]),data[0],data[1],""));
                                }
                            }
                            ActualizarTablas(numLista,tareainicio,deshacer,online);
                        }
                        //Si no se consigue la conexión
                        else
                            JOptionPane.showMessageDialog (null,"No se pudo realizar la acción.",
				"Atención", JOptionPane.INFORMATION_MESSAGE);
                        this.setCursor(Cursor.DEFAULT_CURSOR);
                    }
                }
            }
            //Si se cambia a favorito
            else if (comando.equals("Favorito")){
                Tareas tar = conectarTarea();
                tar.favorito(name+listas[numLista]+tareas[table.getSelectedRow()], 1);
                deshacer.add(new Deshacer("Favorito",name,listas[numLista],tareas[table.getSelectedRow()],
                                            0,"","",""));
                ActualizarTablas(numLista,tareainicio,deshacer,online);
            }
            //Si se pulso el boton Nueva Lista
            else if (comando.equals("No favorito")){
                Tareas tar = conectarTarea();
                if(!listas[numLista].equals("Favoritos")){
                    tar.favorito(name+listas[numLista]+tareas[table.getSelectedRow()], 0);
                    deshacer.add(new Deshacer("Favorito",name,listas[numLista],tareas[table.getSelectedRow()],
                                                1,"","",""));
                }
                else{
                    tar.favorito(name+listfav[table.getSelectedRow()]+tareas[table.getSelectedRow()], 0);
                    deshacer.add(new Deshacer("Favorito",name,listfav[table.getSelectedRow()],tareas[table.getSelectedRow()],
                                                1,"","",""));
                }
                ActualizarTablas(numLista,tareainicio,deshacer,online);
            }
            //////////////// Listas  ////////////////////
            //Si se pulso el boton Nueva Lista
            else if (comando.equals("New Lista")){
                comprobar.parar();
                repintando = true;
                new VentanaLista(name,this,listas.length,numLista,deshacer,online);
            }
            
            //Si se pulso el boton eliminar lista
            else if (comando.equals("Eliminar Lista")){
                if(!(listas[numLista].equals("Lista Principal") || listas[numLista].equals("Favoritos"))){
                    this.setCursor(Cursor.WAIT_CURSOR);
                    String message = "¿Está seguro de que quiere Eliminar la lista "+listas[numLista]+"?";
                    String title = "Eliminar";
                    //Se pide confirmacion para eliminar la tarea
                    int reply = JOptionPane.showConfirmDialog(null, message, title, JOptionPane.YES_NO_OPTION);
                    this.setCursor(Cursor.DEFAULT_CURSOR);
                    //Si se confirma
                    if (reply == JOptionPane.YES_OPTION){
                        this.setCursor(Cursor.WAIT_CURSOR);
                        //Se crea el objeto para actuar contra la bbdd
                        Listas lista = conectarLista();
                        //Si se consigue la conexion
                        if(lista!=null){
                            lista.eliminarlista(name+listas[numLista],name);
                            ActualizarTablas(0,0,deshacer,online);
                        }
                        //Si no se consigue la conexión
                        else
                            JOptionPane.showMessageDialog (null,"No se pudo realizar la acción.",
                        	"Atención", JOptionPane.ERROR_MESSAGE);
                        this.setCursor(Cursor.DEFAULT_CURSOR);
                    }
                }
                else
                    JOptionPane.showMessageDialog (null,"No se puede borrar una lista predefinida.",
                        	"Atención", JOptionPane.ERROR_MESSAGE);
            }
            
            //Si se pulso el boton Cargar
            else if(comando.equals("Cargar")){
                    //Se actualiza la tabla
                    ActualizarTablas(ListaBox.getSelectedIndex(),0,deshacer,online);
            }
            //Si se pulso el boton Siguiente
            else if(comando.equals("Siguiente")){
                    //Se actualiza la tabla
                    ActualizarTablas(numLista,tareainicio+numeroTareas,deshacer,online);
            }
            //Si se pulso el boton Atras
            else if(comando.equals("Atras")){
                    //Se actualiza la tabla
                    ActualizarTablas(numLista,tareainicio-numeroTareas,deshacer,online);
            }
            
            //Si se pulso el boton Exportar Lista
            else if (comando.equals("Exportar Lista")){
                    
                Listas l = this.conectarLista();
                usuario = l.getUsuario(name);
                int i;
                for(i = 0;usuario.getlistas()[i]!=null;i++){}
                new VentanaExportar(usuario,i);
            }
            
            
            else if(comando.equals("Online")){   
                    //Constucción del boton OnLine
                    opciones.remove(botonOnLine);
                    botonOnLine = new JButton("Offline"); 
                    opciones.add(botonOnLine);
                    botonOnLine.setBounds((int)(xlogout*0.4315),(int)(y*0.02),100,30);
                    botonOnLine.setFont(new java.awt.Font("Arial", 0, 20)); 
                    botonOnLine.setActionCommand("Offline");
                    botonOnLine.addActionListener(this);
                    botonOnLine.setIcon(new ImageIcon(getClass().getResource("objetos/Offline.jpg")));
                    opciones.repaint();
                
                    online = false;
            }
            else if(comando.equals("Offline")){   
                    //Constucción del boton OnLine
                    opciones.remove(botonOnLine);
                    botonOnLine = new JButton("Online"); 
                    opciones.add(botonOnLine);
                    botonOnLine.setBounds((int)(xlogout*0.4315),(int)(y*0.02),100,30);
                    botonOnLine.setFont(new java.awt.Font("Arial", 0, 20)); 
                    botonOnLine.setActionCommand("Online");
                    botonOnLine.addActionListener(this);
                    botonOnLine.setIcon(new ImageIcon(getClass().getResource("objetos/Online.jpg")));
                    opciones.repaint();
                    online = true;
                    ActualizarTablas(numLista,tareainicio,deshacer,online);
                
                    
            }
            else if(comando.equals("Enviar")){
                if(!online)
                    JOptionPane.showMessageDialog (null,"No se pueden enviar tareas estando offline.",
                        	"Atención", JOptionPane.WARNING_MESSAGE);
                else{
                    //new Enviar(name);
                    
                    //Se comprueba si seselecciono una tarea
                    String [] Enviados = new String [numtareas];
                    int [] Enviad = new int[numtareas];
                    int Aenviar = 0;
                    boolean end = false;
                    for(int o = 0;o <numtareas && table.getValueAt(o , 1)!=null; o++){
                        String bool = table.getValueAt(o , 4).toString();
                        if ((bool != null)&&(bool.equals("true"))){
                            Enviad[Aenviar] = o;
                            Enviados[Aenviar] = table.getValueAt(o , 1).toString();
                            Aenviar++;
                        }  
                    }
                    if(Aenviar == 0)
                        JOptionPane.showMessageDialog (null,"Debe seleccionar una tarea valida para poder ser enviada.",
				"Atención", JOptionPane.INFORMATION_MESSAGE);
                    else{
                        this.setCursor(Cursor.WAIT_CURSOR);
                        String message;
                        if (Aenviar == 1)
                            message = "¿Está seguro de que quiere enviar la tarea "+Enviados[0]+"?";
                        else
                            message="¿Está seguro de querer enviar "+Aenviar+" tareas?";
                        String title = "Enviar";
                        //Se pide confirmacion para eliminar la tarea
                        int reply = JOptionPane.showConfirmDialog(null, message, title, JOptionPane.YES_NO_OPTION);
                        this.setCursor(Cursor.DEFAULT_CURSOR);
                        //Si se confirma
                        if (reply == JOptionPane.YES_OPTION){
                            this.setCursor(Cursor.WAIT_CURSOR);
                            String nombre = JOptionPane.showInputDialog(this,
                                "Introduzca el nombre de usuario al que desea enviar.",
                                "Envio", JOptionPane.QUESTION_MESSAGE);
                            if(nombre!=null)
                            if (nombre.equals(""))
                                //Se muestra un aviso con el problema
                                JOptionPane.showMessageDialog (null,"Debe indicar a quien quiere enviar la tarea.",
                                    "Atención", JOptionPane.WARNING_MESSAGE); 
                            else{
                                Inicio inicio = conectarInicio();
                                if(!inicio.Existe(nombre))
                                    //Se muestra un aviso con el problema
                                    JOptionPane.showMessageDialog (null,"El usuario indicado no existe.",
                                                    "Atención", JOptionPane.ERROR_MESSAGE);
                                else if(name.equals(nombre))
                                    //Se muestra un aviso con el problema
                                    JOptionPane.showMessageDialog (null,"No puedes enviarte una tarea a tí mismo.",
                                                    "Atención", JOptionPane.WARNING_MESSAGE); 
                                else{
                                    Mensajes mensaje = conectarMensaje();
                                    //Si se consigue la conexion
                                    if(mensaje!=null){
                                        int mess = mensaje.addmensaje(nombre, name);

                                        for(int i = 0; i < Aenviar;i++){
                                            if(!listas[numLista].equals("Favoritos"))
                                                mensaje.addtarea(String.valueOf(mess),name+listas[numLista]+Enviados[i]);
                                            else
                                                mensaje.addtarea(String.valueOf(mess),name+listfav[Enviad[i]]+Enviados[i]);
                                        }
                                        ActualizarTablas(numLista,tareainicio,deshacer,online);
                                    }
                                    //Si no se consigue la conexión
                                    else
                                        JOptionPane.showMessageDialog (null,"No se pudo realizar la acción.",
                                            "Atención", JOptionPane.INFORMATION_MESSAGE);
                                    this.setCursor(Cursor.DEFAULT_CURSOR);
                                }
                            }
                                this.setCursor(Cursor.DEFAULT_CURSOR);
                        }
                }
            
                }
            } 
            else if(comando.equals("Mensajes")){
                if(!online)
                    JOptionPane.showMessageDialog (null,"No se pueden recibir tareas estando offline.",
                        	"Atención", JOptionPane.WARNING_MESSAGE);
                else{
                    repintando = true;
                    comprobar.parar();
                    new VentanaMensajes(name,this,numLista,tareainicio,deshacer,null,online);
                }
            } 
            
            else if(comando.equals("Preferencias")){
                repintando = true;
                comprobar.parar();
                new VentanaPreferencias(name,this,deshacer,null,online);
            }  
            
            else if(comando.equals("Deshacer")){
                ((Deshacer)deshacer.toArray()[deshacer.size()-1]).deshacer();
                deshacer.remove(deshacer.size()-1);
                ActualizarTablas(numLista, tareainicio,deshacer,online);
            } 
            
                        
            else if(comando.equals("Mapas")){
                repintando = true;
                comprobar.parar();
                new VentanaMapa(online,name,numLista, tareainicio,deshacer,this);
                setVisible(false);
            }
            
            
      }
    
    }
    
    
    
}

